﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanserClient;

namespace TankController.Dominio
{
    public class Planta : IPlanta
    {
        private enum TipoOrdem
        {
            Primeira = 0,
            Segunda = 1
        }

        protected const double G = 9.8;
        protected const double A1 = 0.17813919765;
        protected const double KM = 4.6;

        protected IQuanserClient servidor;
        protected int portaLeitura;
        protected int portaLeituraSecundaria;
        protected int portaEscrita;
        protected double fatorConversao;
        protected double ganhoPotencial;
        protected double limiteTensaoPlantaLow;
        protected double limiteTensaoPlantaHigh;
        protected double limiteAlturaPlantaLow;
        protected double limiteAlturaPlantaHigh;

        public Planta()
        {

        }
        /*public Planta(IQuanserClient servidor, int portaLeitura, int portaLeituraSecundaria, int portaEscrita, double fatorConversao, double ganhoPotencial, double limiteTensaoPlantaLow, double limiteTensaoPlantaHigh, double limiteAlturaPlantaLow, double limiteAlturaPlantaHigh)
            : this()
        {
            this.servidor = servidor;
            this.portaLeitura = portaLeitura;
            this.portaLeituraSecundaria = portaLeituraSecundaria;
            this.portaEscrita = portaEscrita;
            this.fatorConversao = fatorConversao;
            this.ganhoPotencial = ganhoPotencial;
            this.limiteTensaoPlantaLow = limiteTensaoPlantaLow;
            this.limiteTensaoPlantaHigh = limiteTensaoPlantaHigh;
            this.limiteAlturaPlantaLow = limiteAlturaPlantaLow;
            this.limiteAlturaPlantaHigh = limiteAlturaPlantaHigh;
        }*/

        public double Ler()
        {
            return servidor.Read(portaLeitura);
        }

        public double LerSensorSecundario()
        {
            if (Global.TipoConfiguracao == TipoConfiguracao.ConfiguracaoA || Global.TipoConfiguracao == TipoConfiguracao.ConfiguracaoC)
            {
                throw new ApplicationException("Não há outro sensor nesta configuração.");
            }
            else
            {
                return servidor.Read(portaLeituraSecundaria);
            }
        }

        public virtual void Escrever(double valor)
        {
            servidor.Write(portaEscrita, valor);
        }

        /*public Boolean UltrapassaLimiteAlturaAuxiliarHigh(double limiteSeguranca)
        {
            double valorAmplitude = servidor.Read(0) * fatorConversao;

            return portaLeitura == 1 && valorAmplitude >= limiteAlturaPlantaHigh * (1 - limiteSeguranca);
        }

        public Boolean UltrapassaLimiteAlturaAuxiliarLow(double limiteSeguranca)
        {
            double valorAmplitude = servidor.Read(0) * fatorConversao;

            return portaLeitura == 1 && valorAmplitude <= limiteAlturaPlantaLow + (limiteAlturaPlantaHigh * limiteSeguranca);
        }*/

        /*public Boolean IsPrimeiraOrdem()
        {
            return portaLeitura == (int)TipoOrdem.Primeira;
        }*/

        public IQuanserClient Servidor
        {
            get { return servidor; }
            set { servidor = value; }
        }
        public int PortaLeitura
        {
            get { return portaLeitura; }
            set { portaLeitura = value; }
        }
        public int PortaLeituraSecundaria
        {
            get { return portaLeituraSecundaria; }
            set { portaLeituraSecundaria = value; }
        }
        public int PortaEscrita
        {
            get { return portaEscrita; }
            set { portaEscrita = value; }
        }
        public double FatorConversao
        {
            get { return fatorConversao; }
            set { fatorConversao = value; }
        }
        public double GanhoPotencial
        {
            get { return ganhoPotencial; }
            set { ganhoPotencial = value; }
        }
        public double LimiteTensaoPlantaHigh
        {
            get { return limiteTensaoPlantaHigh; }
            set { limiteTensaoPlantaHigh = value; }
        }
        public double LimiteTensaoPlantaLow
        {
            get { return limiteTensaoPlantaLow; }
            set { limiteTensaoPlantaLow = value; }
        }
        public double LimiteAlturaPlantaHigh
        {
            get { return limiteAlturaPlantaHigh; }
            set { limiteAlturaPlantaHigh = value; }
        }
        public double LimiteAlturaPlantaLow
        {
            get { return limiteAlturaPlantaLow; }
            set { limiteAlturaPlantaLow = value; }
        }
    }
}
